package licode.unisop.oidc.auth.gateway;

import licode.unisop.oidc.auth.api.OidcSession;
import licode.unisop.oidc.auth.modal.*;

/**
 * 登录的委托类
 *
 * @author licode
 */
public interface  AuthorDelegate {
    /**
     * 普通登录接口
     *
     * @param req 登录参数信息
     * @return 返回登录信息
     */
    OidcToken login(AuthorRequest req);

    /**
     * 单点登录生成主会话接口
     *
     * @param req 登录参数信息
     * @return 返回主会话Token
     */
    SsoToken buildMasterSession(AuthorRequest req);
    String loginIdFromAccessToken(AccessTokenId tokenId);
    String loginIdFromRefreshToken(RefreshTokenId tokenId);

    /**
     * 单点登录接口
     *
     * @param req 登录参数信息
     * @return 返回登录信息
     */
    OidcToken loginSso(AuthorRequest req);

    /**
     * 刷新访问信息
     * @param request 请求参数信息
     * @return 返回登录令牌信息
     */
    OidcToken refresh(RefreshTokenId request, boolean newToken);

    /**
     * 根据访问令牌获取登录信息
     *
     * @param accessToken 访问令牌
     * @return 登录信息
     */
    OidcToken getTokenInfo(AccessTokenId accessToken);

    /**
     * 通过用户ID获取对应的会话信息
     * @param userId 用户ID
     * @return 会话信息
     */
    OidcSession getSession(UserInfoId userId);

    /**
     * 通过访问令牌获取对应的会话信息
     * @param accessToken 访问令牌
     * @return 会话信息
     */
    OidcSession getSession(AccessTokenId accessToken);

    OidcSession getSession(SsoTokenId ssoToken);

    /**
     * 退出登录
     *
     * @param accessToken 访问令牌
     */
    void exitLogin(AccessTokenId accessToken);

    /**
     * 踢人下线
     *
     * @param accessToken 访问令牌
     */
    void kickLogin(AccessTokenId accessToken);

    /**
     * 踢掉指定用户所有登录
     *
     * @param userInfoId 用户ID
     */
    void kickLogin(UserInfoId userInfoId);

    /**
     * 冻结登录
     *
     * @param accessToken 访问令牌
     */
    void freezeLogin(AccessTokenId accessToken);

    /**
     * 解冻登录
     *
     * @param accessToken 访问令牌
     */
    void unfreezeLogin(AccessTokenId accessToken);

    /**
     * 冻结整个用户登录
     *
     * @param userInfoId 用户ID
     */
    void freezeLogin(UserInfoId userInfoId);

    /**
     * 解冻整个用户登录
     *
     * @param userInfoId 用户ID
     */
    void unfreezeLogin(UserInfoId userInfoId);

    /**
     * 退出单点登录
     * @param accessToken 访问令牌
     */
    void exitSso(AccessTokenId accessToken);

    /**
     * 退出会话，包括普通登录和单点登录
     * @param loginId 登录标识
     */
    void exitSession(LoginId loginId);

    /**
     * 退出会话，包括普通登录和单点登录
     * @param accessToken 访问令牌
     */
    void exitSession(AccessTokenId accessToken);
}
